[2026-02-27] P4

๐Ÿฆฅ ๋ณธ๋ฌธ

Background

OpenFlow : Control plane๊ณผ Data plane ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค. ๊ธฐ์กด์—๋Š” 12๊ฐœ์˜ ํ—ค๋” ํ•„๋“œ์—์„œ ๋งค์นญํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ๊ทœ์น™ ํ…Œ์ด๋ธ”์ด ์กด์žฌ. ํ•˜์ง€๋งŒ ํŒจํ‚ท ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์˜ ๋ฐœ๋‹ฌ๋กœ 41๊ฐœ์˜ ๋‹ค๋‹จ๊ณ„ ๊ทœ์น™ ํ…Œ์ด๋ธ”์ด ์ถ”๊ฐ€๋˜๋ฉด์„œ ๋ณต์žกํ•ด์ง€๊ณ  ์žˆ์Œ.

Motivation

  1. ๊ณ ์ •๋œ ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„์˜ ์ œ์•ฝ์œผ๋กœ ์ธํ•œ ๋ณต์žก์„ฑ ๋ฐ ์œ ์—ฐ์„ฑ ๋ถ€์กฑ
    • ํ—ค๋” ํ•„๋“œ์˜ ์ถ”๊ฐ€์™€ ๋‹ค๋‹จ๊ณ„ ๊ทœ์น™์œผ๋กœ ์‚ฌ์–‘์˜ ๋ณต์žก์„ฑ์ด ์ฆ๊ฐ€.

      โ†’ ์‚ฌ์–‘์„ ํ™•์žฅํ•˜๋Š” ๋Œ€์‹  ํŒจํ‚ท์„ ํŒŒ์‹ฑํ•˜๊ณ  ํ—ค๋” ํ•„๋“œ๋ฅผ ๋งค์นญํ•˜๋Š” ์œ ์—ฐํ•œ ๋งค์ปค๋‹ˆ์ฆ˜ ์ง€์›

    • OpenFlow๋Š” ์‚ฌ์ „์— ์ •ํ•ด์ง„ ํ•„๋“œ์™€ ์•ก์…˜์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•จ

      โ†’ ํŠน์ • ํ”„๋กœํ† ์ฝœ ํ•„๋“œ๊ฐ€ ์‚ฌ์ „์— ์ •ํ•ด์ ธ ์žˆ์ง€ ์•Š์•„๋„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ƒˆ๋กœ์šด ํ—ค๋” ์œ ํ˜•์„ ์ง์ ‘ ์„ ์–ธํ•˜๊ณ  ์ฒ˜๋ฆฌ

  2. ์ €์ˆ˜์ค€ ์ธํ„ฐํŽ˜์ด์Šค
    • ์นฉ์˜ ์ œ์กฐ์‚ฌ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ฒด๊ณ„๋ฅผ ๊ฐ€์ง€๋ฉฐ ํ•˜๋“œ์›จ์–ด์™€ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์ด ๋‹ค๋ฆ„

      โ†’ ์ถ”์ƒํ™”๋ฅผ ํ†ตํ•ด ํ•˜๋“œ์›จ์–ด์— ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋ž˜๋ฐ

Goal

  1. ์žฌ์„ค์ • ๊ฐ€๋Šฅ์„ฑ : ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŒจํ‚ท ํŒŒ์‹ฑ ๋ฐ ์ฒ˜๋ฆฌ๋ฅผ ์žฌ์ •์˜ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์œ ์—ฐํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณต
  2. ํ”„๋กœํ† ์ฝœ ๋…๋ฆฝ์„ฑ
    • ์Šค์œ„์น˜๋Š” ํŠน์ • ํŒจํ‚ท ํ˜•์‹์— ์–ฝ๋งค์ด์ง€ ์•Š์Œ
    • ์ปจํŠธ๋กค๋Ÿฌ๋Š” ํŠน์ • ํŒจํ‚ท ํ˜•์‹์— ๋งž๋Š” ํŒจํ‚ท ํŒŒ์„œ์™€ ๋งค์น˜&์•ก์…˜ ํ…Œ์ด๋ธ”์˜ ์ง‘ํ•ฉ์„ ์ง€์ •
  3. ํƒ€๊ฒŸ ๋…๋ฆฝ์„ฑ : ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์Šค์œ„์น˜์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์•Œ ํ•„์š” ์—†์Œ. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” P4 ์ฝ”๋“œ๋ฅผ ์Šค์œ„์น˜๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํƒ€๊ฒŸ ์ข…์†์ ์ธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ ์Šค์œ„์น˜์˜ ๊ธฐ๋Šฅ์„ ๊ณ ๋ ค.

FORWARDING MODEL

image.png

์ƒˆ๋กœ์šด ํ—ค๋”๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€๋Šฅํ•œ ํŒŒ์„œ + ์ง๋ ฌ ๋˜๋Š” ๋ณ‘๋ ฌ์˜ ์กฐํ•ฉ์œผ๋กœ ๋ฐฐ์—ด๋œ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์˜ ๋งค์น˜+์•ก์…˜ ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ.

  • ์•ก์…˜์€ ํ”„๋กœํ† ์ฝœ ๋…๋ฆฝ์ . ๋˜ํ•œ primitive๋“ค๋กœ ๊ตฌ์„ฑ๋จ.
    • primitive : ๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ์ตœ์†Œ ๋‹จ์œ„์˜ ๋™์ž‘.
      • ex) ์ฒดํฌ์„ฌ ๊ณ„์‚ฐ, ํ•„๋“œ ๊ฐ’ ์ฆ๊ฐ
  • ๋‹ค์–‘ํ•œ ํŒจํ‚ท ์ „๋‹ฌ ์žฅ์น˜ ๋ฐ ์ฒ˜๋ฆฌ ๊ธฐ์ˆ ์„ ์ผ๋ฐ˜ํ™”ํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋‹ค์–‘ํ•œ ์žฅ์น˜์— ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€๊ฒŸ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ฆ
  • Configure๊ณผ Populate์— ์˜ํ•ด ์ œ์–ด
    • Configure : ์–ด๋–ค ํ”„๋กœํ† ์ฝœ์ด ์ง€์›๋˜๋Š” ์ง€์™€ ์Šค์œ„์น˜๊ฐ€ ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ• ๊ฒฐ์ •
      • ํŒŒ์„œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ
      • ๋งค์น˜+ ์•ก์…˜ ๋‹จ๊ณ„์˜ ์ˆœ์„œ ์„ค์ •
      • ๊ฐ ๋‹จ๊ณ„์—์„œ ์ฒ˜๋ฆฌ๋˜๋Š” ํ•„๋“œ ์ง€์ •
    • Populate : ํŠน์ • ์‹œ์ ์— ํŒจํ‚ท์— ์ ์šฉ๋˜๋Š” ์ •์ฑ…์„ ๊ฒฐ์ • **
      • Configuration ์ค‘์— ์ง€์ •๋œ ๋งค์น˜+์•ก์…˜ ํ…Œ์ด๋ธ”์— ์—”ํŠธ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ ๋ฐ ์ œ๊ฑฐ
    • Configuration ๋‹จ๊ณ„. ์ฆ‰ ํŒŒ์ดํ”„๋ผ์ธ์„ ์„ค๊ณ„ํ•˜๋Š” ๋‹จ๊ณ„์—์„œ๋Š” ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์‹ค์ œ ๊ตฌํ˜„ ์‹œ์—๋Š” ์„ค์ •์„ ๋ฐ”๊พธ๋Š” ์ค‘์—๋„ ์ค‘๋‹จ ์—†์ด ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•ด์•ผ ์žฌ์„ค์ • ๋ชฉํ‘œ์—๋„ ์–ด๊ธ‹๋‚˜์ง€ ์•Š์Œ
      • ๊ณ ์ • ๊ธฐ๋Šฅ ASIC ์Šค์œ„์น˜์—์„œ๋Š” Configuration ๋‹จ๊ณ„๊ฐ€ ์˜๋ฏธ๊ฐ€ ์—†๊ณ  P4 ํ”„๋กœ๊ทธ๋žจ์„ ์ง€์›ํ•˜๋Š” ์ง€๋งŒ ํ™•์ธ

๋™์ž‘ ํ๋ฆ„

  1. ํŒŒ์„œ์— ์˜ํ•ด ํŒจํ‚ท ์ฒ˜๋ฆฌ
    • payload๋Š” ๋ณ„๋„๋กœ ๋ฒ„ํผ๋ง๋˜๋ฉฐ ๋งค์นญ์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
    • ํ—ค๋”์—์„œ ํ•„๋“œ๋ฅผ ์ถ”์ถœ.
      • ํŒŒ์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง€์ •ํ•œ ๋Œ€๋กœ, ํŒจํ‚ท์„ ์ž๋ฆ„. ์ž˜๋ผ์ง„ ํ˜•ํƒœ๋ฅผ ํ•„๋“œ๋ผ๊ณ  ํ•จ. ์Šค์œ„์น˜๋Š” ๋งค์น˜+์•ก์…˜ ์‹œ, ๋ฌด์Šจ ํ”„๋กœํ† ์ฝœ์ธ์ง€ ๋”ฐ์ง€์ง€ ์•Š๊ณ  ํ•„๋“œ๋ฅผ ๊ทœ์น™๋Œ€๋กœ ๋น„๊ตํ•˜๊ณ  ๋ฐ”๊ฟˆ
  2. ๋งค์น˜+์•ก์…˜ ํ…Œ์ด๋ธ”์€ ingress์™€ egress๋กœ ๋‚˜๋‰จ

    ๋‘ ๋‹จ๊ณ„ ๋ชจ๋‘ ํŒจํ‚ท ํ—ค๋”๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Œ

    • ingress match+action : ํŒจํ‚ท์ด ๋‚˜๊ฐˆ ์ถœ๋ ฅ ํฌํŠธ์™€ ํŒจํ‚ท์ด ๋ฐฐ์น˜๋  ํ๋ฅผ ๊ฒฐ์ •
      • ํŒจํ‚ท ์ „๋‹ฌ, ๋ณต์ œ(๋ฉ€ํ‹ฐ์บ์ŠคํŠธ, ์ŠคํŒฌ ๋˜๋Š” control plane ์ „์†ก ์šฉ), ํ๊ธฐ๋˜๊ฑฐ๋‚˜ flow control์„ ํŠธ๋ฆฌ๊ฑฐ
    • egress match+action : ํŒจํ‚ท ํ—ค๋”์— ์ธ์Šคํ„ด์Šค๋ณ„ ์ˆ˜์ •์„ ์ˆ˜ํ–‰
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ€ํ‹ฐ์บ์ŠคํŠธ ๊ฐ™์ด ํ•˜๋‚˜์˜ ํŒจํ‚ท์„ ์—ฌ๋Ÿฌ ํฌํŠธ๋กœ ๋‚˜๊ฐˆ ๋•Œ, ํฌํŠธ๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ๋‹ค๋ฅด๊ฒŒ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌ
    • action table : ํ”„๋ ˆ์ž„ ๊ฐ„ ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ์นด์šดํ„ฐ, policers ๋“ฑ์˜ ์•ก์…˜ ํ…Œ์ด๋ธ”์„ ํ”Œ๋กœ์šฐ์™€ ์—ฐ๊ฒฐ
      • policer : ์†๋„ ์ œํ•œ์„ ์ถ”์ 
    • metadata ์ถ”๊ฐ€ : ํŒจํ‚ท์— ๋‹จ๊ณ„๋งˆ๋‹ค ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ „๋‹ฌ. ํŒจํ‚ท ํ—ค๋” ํ•„๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ingress port, ์ „์†ก ๋ชฉ์ ์ง€ ๋ฐ ํ, ์Šค์ผ€์ฅด๋ง์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” timestamp, ๊ฐ€์ƒ ๋„คํŠธ์›Œํฌ ์‹๋ณ„์ž ๋“ฑ
    • Queueing : OpenFlow์™€ ๋™์ผ.
      • ์•ก์…˜์ด ํŒจํ‚ท์„ ํ์— ๋งคํ•‘. ํ์˜ ์Šค์ผ€์ฅด๋ง์€ configuration ๋‹จ๊ณ„์—์„œ ์ •ํ•ด์ง
        • ์Šค์ผ€์ฅด๋ง์˜ ์˜ˆ์‹œ : ์ตœ์†Œ ๋Œ€์—ญํญ, DRR ๋“ฑ
    • Congestion control : ๋งค์น˜+์•ก์…˜ ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ECN ๋น„ํŠธ ์„ค์ •

A PROGRAMMING LANGUAGE

์–ธ์–ด์˜ ์—ญํ• 

  1. ํŒจํ‚ท ํ˜•์‹ ์„ ์–ธ : ํŒŒ์„œ์—๊ฒŒ ํ—ค๋” ์œ ํ˜• ์„ ์–ธ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์•ž 14๋ฐ”์ดํŠธ๋Š” ์ด๋”๋„ท, ๊ทธ ๋’ค์—๋Š” IP ํ—ค๋”๊ฐ€ ์˜ฌ ๊ฒƒ์ด๋ผ๊ณ  ๊ตฌ์กฐ๋ฅผ ์ •์˜
  2. ํŒจํ‚ท ํ—ค๋” ์ฒ˜๋ฆฌ : ์„ ์–ธ๋œ ํ—ค๋” ์œ ํ˜•๊ณผ ๊ธฐ๋ณธ ์•ก์…˜ ์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋” ํ•„๋“œ ์ฒ˜๋ฆฌ
    • ์˜ˆ๋ฅผ ๋“ค์–ด, TTL ํ•„๋“œ ๊ฐ์†Œ, checksum ๊ณ„์‚ฐ ๋“ฑ

๊ธฐ์กด Click๊ณผ์˜ ๋น„๊ต

C++๋กœ ๊ตฌ์„ฑ๋œ ๋ชจ๋“ˆ์„ ํ†ตํ•ด ์Šค์œ„์น˜๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ์–ธ์–ด

  • parse - match - action ํŒŒ์ดํ”„๋ผ์ธ์„ ๋ฐ˜์˜ํ•˜์ง€ ์•Š์Œ
  • controller-switch ๊ตฌ์กฐ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋˜์ง€ ์•Š์•„์„œ, ๋™์ ์œผ๋กœ populated match+action ํ…Œ์ด๋ธ”์„ ๊ธฐ์ˆ ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€
  • ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์˜์กด์„ฑ ํŒŒ์•…์ด ํž˜๋“ฆ
    • TDG (ํ…Œ์ด๋ธ” ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„) : ์˜์กด์„ฑ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„

      image.png

      • ํ•„๋“œ ์ž…๋ ฅ, ์•ก์…˜, ๊ทธ๋ฆฌ๊ณ  ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์ œ์–ด ํ๋ฆ„์„ ๊ธฐ์ˆ 
      • ๋…ธ๋“œ๋“ค์€ ๋งค์น˜+์•ก์…˜ ํ…Œ์ด๋ธ”์— ์ง์ ‘ ๋งคํ•‘๋˜๋ฉฐ, ์˜์กด์„ฑ ๋ถ„์„์„ ํ†ตํ•ด ๊ฐ ํ…Œ์ด๋ธ”์ด ํŒŒ์ดํ”„๋ผ์ธ์˜ ์–ด๋””์— ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‹๋ณ„
      • ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๊ธฐ์กด C++ ๊ธฐ๋ฐ˜์˜ Click์œผ๋กœ๋Š” TDG๋ฅผ ์ƒ๊ฐํ•˜๊ธฐ๋Š” ์–ด๋ ค์›€

P4์˜ ์ปดํŒŒ์ผ ํ”„๋กœ์„ธ์Šค

  1. ์ œ์–ด ํ๋ฆ„์„ ๋‚˜ํƒ€๋‚ด๋Š” P4๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ์งฌ
  2. ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•˜์—ฌ TDG๋กœ ๋ฒˆ์—ญํ•œ ํ›„ TDG๋ฅผ ํŠน์ • ์Šค์œ„์น˜์˜ ํƒ€๊ฒŸ ํ›„ ๋งคํ•‘

P4 LANGUAGE BY EXAMPLE

Background

๋„คํŠธ์›Œํฌ๋Š” End-host์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜๋Š” Edge์™€ edge๋“ค๊ณผ ์—ฐ๊ฒฐ๋œ core๊ฐ€ ์žˆ์Œ. End-host๊ฐ€ ๋งŽ์•„์ง€๋ฉด์„œ core์˜ L2 ํ…Œ์ด๋ธ”(์Šค์œ„์น˜๋“ค์ด ๊ธฐ์–ตํ•ด์•ผ ํ•  ์ฃผ์†Œ)๊ฐ€ ๋„˜์นจ

  • ๊ธฐ์กด ํ•ด๊ฒฐ์ฑ…
    • MPLS : ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ด๋ธ” ๋ถ„๋ฐฐ ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„์ด ์–ด๋ ค์›€
    • PortLand : MAC ์ฃผ์†Œ๋ฅผ ๋‹ค์‹œ ์จ์•ผํ•˜๋ฏ€๋กœ ๊ธฐ์กด ๋„คํŠธ์›Œํฌ ๋””๋ฒ„๊น… ๋„๊ตฌ๋ฅผ ๋ง๊ฐ€๋œจ๋ฆด ๊ฐ€๋Šฅ์„ฑ. ARP ์š”์ฒญ์— ์‘๋‹ตํ•  ์ƒˆ๋กœ์šด ์—์ด์ „ํŠธ๊ฐ€ ํ•„์š”
  • P4์˜ mTag : 32๋น„ํŠธ ํƒœ๊ทธ. src ๊ฒฝ๋กœ ๋˜๋Š” destination locator์ด ๋‹ด๊น€
    1. ํŒจํ‚ท์ด ์ฒซ ๋ฒˆ์งธ ToR ์Šค์œ„์น˜์— ๋“ค์–ด์˜ฌ ๋•Œ 32๋น„ํŠธ ํƒœ๊ทธ๋ฅผ ๋ถ™์ž„
      • End-host์˜ NIC์—์„œ๋„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
    2. ์ฝ”์–ด ์Šค์œ„์น˜๋Š” ํƒœ๊ทธ์˜ 1 ๋ฐ”์ดํŠธ๋งŒ ๊ฒ€์‚ฌํ•˜์—ฌ ์Šค์œ„์นญ

P4 Concepts

  • ํ—ค๋” ์ •์˜ : ์ผ๋ จ์˜ ํ•„๋“œ๋“ค์˜ ์ˆœ์„œ์™€ ๊ตฌ์กฐ๋ฅผ ๊ธฐ์ˆ . ํ•„๋“œ์˜ ๋„ˆ๋น„ ์ง€์ •๊ณผ ํ•„๋“œ ๊ฐ’ ๋ฒ”์œ„์— ๋Œ€ํ•œ ์ œ์•ฝ์ด๋‚˜ ๊ฐ€๋ณ€ ํฌ๊ธฐ ํ•„๋“œ์˜ ์ตœ๋Œ€ ๊ธธ์ด ์„ค์ •
    • Ex) ํ‘œ์ค€ ์ด๋”๋„ท๊ณผ VLAN ํ—ค๋”

        header ethernet {
          fields {
            dst_addr : 48; // width in bits
            src_addr : 48;
            ethertype : 16;
          }
        }
              
        header vlan {
          fields {
            pcp : 3;
            cfi : 1;
            vid : 12;
            ethertype : 16;
          }
        }
      
    • mTag : ๊ธฐ์กด์˜ ์„ ์–ธ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ์ถ”๊ฐ€. ํ•„๋“œ ์ด๋ฆ„์„ ๋ณด๋ฉด, ์ฝ”์–ด๊ฐ€ ๋‘ ๋‹จ๊ณ„์˜ aggregation layer๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์Œ

      • ์Šค์œ„์น˜๋Š” ์œ„์น˜(1๋‹จ๊ณ„ ์Šค์œ„์น˜์ธ์ง€ 2๋‹จ๊ณ„ ์Šค์œ„์น˜์ธ์ง€)์™€ ํŒจํ‚ท ์ด๋™ ๋ฐฉํ–ฅ(ํŒจํ‚ท์ด ์ƒํ–‰์ธ์ง€ ํ•˜ํ–‰์ธ์ง€)์— ๋”ฐ๋ผ ๋ฐ”์ดํŠธ๋ฅผ ๊ฒ€์‚ฌ
        header mTag {
          fields {
            up1 : 8;
            up2 : 8;
            down1 : 8;
            down2 : 8;
            ethertype : 16;
          }
        } 
      
  • ํŒŒ์„œ ์ •์˜ : ํŒจํ‚ท ๋‚ด์—์„œ ํ—ค๋”์™€ ์œ ํšจํ•œ ํ—ค๋” ์‹œํ€€์Šค๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •
    1. ์ƒํƒœ ๋จธ์‹  ๋ฐฉ์‹ : ํŒจํ‚ท์˜ ์‹œ์ž‘-๋๊นŒ์ง€ ํƒ์ƒ‰ํ•˜์—ฌ ํ—ค๋”๋ฅผ ํ•˜๋‚˜ ์”ฉ ์ถ”์ถœ. ์ถ”์ถœ๋œ ๊ฐ’์€ ๋งค์น˜+์•ก์…˜ ํ…Œ์ด๋ธ”๋กœ ์ด๋™
    2. ์ „์ด : ๋‹ค์Œ ํ—ค๋”๋กœ ์ด๋™. ํ˜„์žฌ ํ—ค๋”์˜ ๊ฐ’์— ์˜ํ•ด ํŠธ๋ฆฌ๊ฑฐ
      • EX) mTag
       parser start {
         ethernet; [cite: 285, 287]
       }
              
       parser ethernet {
         switch(ethertype) {
           case 0x8100: vlan; [cite: 288, 289, 292]
           case 0x9100: vlan; [cite: 293]
           case 0x800: ipv4; [cite: 294]
           // Other cases
         }
       }
              
       parser vlan {
         switch(ethertype) {
           case 0xaaaa: mTag; [cite: 308, 309, 312]
           case 0x800: ipv4; [cite: 313]
           // Other cases
         }
       }
              
       parser mTag {
         switch(ethertype) {
           case 0x800: ipv4; [cite: 315, 316, 317]
           // Other cases
         }
       }
      
    • ํŒŒ์‹ฑ์€ start ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜์—ฌ stop์ด๋‚˜ ์—๋Ÿฌ ์ƒํ™ฉ๊นŒ์ง€ ์ง„ํ–‰. ์ƒˆ๋กœ์šด ํ—ค๋”๋ฅผ ์œ„ํ•œ ์ƒํƒœ์— ๋„๋‹ฌํ•˜๋ฉด ์ƒํƒœ๋จธ์‹ ์€ specification์„ ์‚ฌ์šฉํ•˜์—ฌ ํ—ค๋”๋ฅผ ์ถ”์ถœํ•˜๊ณ  ์ „์ด. mTag๋ฅผ ์œ„ํ•œ ํŒŒ์„œ๋Š” ๋‹จ์ˆœ
  • ํ…Œ์ด๋ธ” ๋งค์น˜ : ํ…Œ์ด๋ธ”์ด ๋งค์นญํ•  ์ˆ˜ ์žˆ๋Š” ํ•„๋“œ์™€ ํ…Œ์ด๋ธ”์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์…˜์„ ์ •์˜
    • ์˜ˆ๋ฅผ ๋“ค์–ด, mTag์—์„œ ์—์ง€ ์Šค์œ„์น˜๋Š” L2 destination ์ฃผ์†Œ์™€ VLAN ID๋ฅผ ๋งค์นญํ•˜๊ณ  ํ—ค๋”์— ์ถ”๊ฐ€ํ•  mTag๋ฅผ ์ˆ˜ํ–‰

        table mTag_table {
          reads {
            ethernet.dst_addr : exact;
            vlan.vid : exact;
          }
          actions {
            // At runtime, entries are programmed with params
            // for the mTag action. See below.
            add_mTag;
          }
          max_size : 20000;
        }
      
      • reads : ๋งค์น˜ ์œ ํ˜• (exact, ternary ๋“ฑ)์— ๋”ฐ๋ผ ์ œํ•œ๋œ, ๋งค์นญํ•  ํ•„๋“œ๋ฅผ ์„ ์–ธ
      • actions : ํŒจํ‚ท์— ์ ์šฉ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅํ•œ ์•ก์…˜๋“ค์„ ๋‚˜์—ด
      • max_size : ํ…Œ์ด๋ธ”์ด ์ง€์›ํ•ด์•ผ ํ•˜๋Š” ์—”ํŠธ๋ฆฌ์ˆ˜๋ฅผ ์ง€์ •.
    • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ…Œ์ด๋ธ” ์‚ฌ์–‘์„ ๋ณด๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์œ ํ˜•(TCAM, SRAM)๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ๊ฒฐ์ •
    • ex) ์ œ์–ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ด๋ธ”์˜ ์ •์˜ ๋ง›๋ณด๊ธฐ

        table source_check {
          // Verify mtag only on ports to the core
          reads {
            mtag : valid; // Was mtag parsed?
            metadata.ingress_port : exact;
          }
          actions { // Each table entry specifies *one* action
            // If inappropriate mTag, send to CPU
            fault_to_cpu;
            // If mtag found, strip and record in metadata
            strip_mtag;
            // Otherwise, allow the packet to continue
            pass;
          }
          max_size : 64; // One rule per port
        }
              
        table local_switching {
          // Reads destination and checks if local
          // If miss occurs, goto mtag table.
        }
              
        table egress_check {
          // Verify egress is resolved
          // Do not retag packets received with tag
          // Reads egress and whether packet was mTagged
        }
      
  • ์•ก์…˜ : ๋‹จ์ˆœํ•˜๊ณ  ํ”„๋กœํ† ์ฝœ ๋…๋ฆฝ์ ์ธ primitive๋“ค๋กœ ๋ณต์žกํ•œ ์•ก์…˜์„ ๊ตฌ์„ฑํ•˜์—ฌ ์•ก์…˜ ํ•จ์ˆ˜ ์„ธํŠธ๋ฅผ ์„ ์–ธ
    • ์•ก์…˜ ํ•จ์ˆ˜๋“ค์€ ์‚ฌ์–‘ ์ •์˜์™€ ์—”ํŠธ๋ฆฌ ์ถ”๊ฐ€ ๊ณผ์ •์„ ๋‹จ์ˆœํ™”.
    • P4๋Š” ์•ก์…˜ ํ•จ์ˆ˜ ๋‚ด์˜ primitive๋“ค์ด ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰๋œ๋‹ค๊ณ  ๊ฐ€์ •.
      • ๋ณ‘๋ ฌ ์‹คํ–‰์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์Šค์œ„์น˜๋Š” ์—๋ฎฌ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ๊ตฌํ˜„
        • ์—๋ฎฌ๋ ˆ์ด์…˜ : ์†Œํ”„ํŠธ์›จ์–ด๋‚˜ ๋…ผ๋ฆฌ์ ์ธ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ทธ ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋˜‘๊ฐ™์ด ํ‰๋‚ด๋‚ด๋Š” ๊ฒƒ
    • EX) add_mTag ์•ก์…˜

        action add_mTag(up1, up2, down1, down2, egr_spec) {
          add_header(mTag);
          // Copy VLAN ethertype to mTag 
          copy_field(mTag.ethertype, vlan.ethertype);
          // Set VLANโ€™s ethertype to signal mTag
          set_field(vlan.ethertype, 0xaaaa);
          set_field(mTag.up1, up1);
          set_field(mTag.up2, up2);
          set_field(mTag.down1, down1);
          set_field(mTag.down2, down2);
          // Set the destination egress port as well
          set_field(metadata.egress_spec, egr_spec);
        }
              
      
      • ์•ก์…˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋Ÿฐํƒ€์ž„์— ๋งค์น˜ ํ…Œ์ด๋ธ”๋กœ๋ถ€ํ„ฐ ์ œ๊ณต
      • ์œ„์˜ ๊ธฐ๋Šฅ์€ VLAN ํƒœ๊ทธ ๋’ค์— mTag๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ๋‹ค์Œ์— ์˜ค๋Š” ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด VLAN ํƒœ๊ทธ์˜ Ethertype์„ mTag๋กœ ๋ณต์‚ฌํ•˜๋ฉฐ mTag์ž„์„ ์‹ ํ˜ธํ•˜๊ธฐ ์œ„ํ•ด VLAN ํƒœ๊ทธ์˜ 0xaaaa๋กœ ์„ค์ •
      • ํŒจํ‚ท์—์„œ mTag๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ์—ญ๋ฐฉํ–ฅ ์•ก์…˜ ์‚ฌ์–‘๊ณผ ์—์ง€ ์Šค์œ„์น˜์—์„œ ์ด ์•ก์…˜์„ ์ ์šฉํ•˜๋Š” ํ…Œ์ด๋ธ”์€ ์•ˆ ์ผ์Œ
    • primitive actions
      • set field : ํ—ค๋”์˜ ํŠน์ • ํ•„๋“œ๋ฅผ ํŠน์ • ๊ฐ’์œผ๋กœ ์„ค์ •. ๋งˆ์Šคํฌ ์„ค์ •์ด ์ง€์›.
      • copy field : ํ•œ ํ•„๋“œ๋ฅผ ๋‹ค๋ฅธ ํ•„๋“œ๋กœ ๋ณต์‚ฌ.
      • add header : ํŠน์ • ํ—ค๋” ์ธ์Šคํ„ด์Šค์™€ ๊ทธ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์œ ํšจํ•œ ์ƒํƒœ๋กœ ์„ค์ •.
      • remove header : ํŒจํ‚ท์—์„œ ํ—ค๋”์™€ ๊ทธ ๋ชจ๋“  ํ•„๋“œ๋ฅผ ์‚ญ์ œ(pop).
      • increment : ํ•„๋“œ์˜ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚ค๊ฑฐ๋‚˜ ๊ฐ์†Œ.
      • checksum : IPv4 ์ฒดํฌ์„ฌ๊ณผ ๊ฐ™์ด ์ผ๋ถ€ ํ—ค๋” ํ•„๋“œ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์ฒดํฌ์„ฌ์„ ๊ณ„์‚ฐ.
  • ์ œ์–ด ํ”„๋กœ๊ทธ๋žจ : ๋งค์น˜+์•ก์…˜ ํ…Œ์ด๋ธ”์˜ ์ˆœ์„œ๋ฅผ ๊ฒฐ์ •. ๋‹จ์ˆœํ•œ ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋žจ์ด ๋งค์น˜+์•ก์…˜ ํ…Œ์ด๋ธ” ๊ฐ„์˜ ์ œ์–ด ํ๋ฆ„์„ ๊ธฐ์ˆ 
    • ํ•จ์ˆ˜, ์กฐ๊ฑด๋ฌธ, ํ…Œ์ด๋ธ” ์ฐธ์กฐ์˜ ์ง‘ํ•ฉ์„ ํ†ตํ•ด ์ œ์–ด ํ๋ฆ„์„ ์ง€์ •
    • mTag ๊ตฌํ˜„

      image.png

      1. ํŒŒ์‹ฑ ํ›„ source_check ํ…Œ์ด๋ธ”์—์„œ ์ˆ˜์‹ ๋œ ํŒจํ‚ท๊ณผ ์ธ๊ทธ๋ ˆ์Šค ํฌํŠธ ์‚ฌ์ด์˜ ์ผ๊ด€์„ฑ ๊ฒ€์ฆ
        • mTag๋Š” ์ฝ”์–ด ์Šค์œ„์น˜์˜ ์—ฐ๊ฒฐ๋œ ํฌํŠธ์—์„œ๋งŒ ๋ณด์ด๊ฒŒ ๋จ
        • mTag๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์žˆ์—ˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์— ๊ธฐ๋ก.
          • ์ด ํ›„ ํ…Œ์ด๋ธ”์ด ํƒœ๊ทธ๋ฅผ ๋ถ™์ด๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋งค์นญ์— ์‚ฌ์šฉ
      2. local_switching ํ…Œ์ด๋ธ”
        • miss๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํŒจํ‚ท์˜ ๋ชฉ์ ์ง€๊ฐ€ ๋กœ์ปฌ๋กœ ์—ฐ๊ฒฐ๋œ ํ˜ธ์ŠคํŠธ๊ฐ€ ์•„๋‹˜
          • mTag_table์ด ์ ์šฉ
        • ๋กœ์ปฌ๋กœ ๊ฐ€๋“  (hit), Core๋กœ ๊ฐ€๋“ (miss) egress_check ํ…Œ์ด๋ธ” ์ ์šฉ
          • ๋งŒ์•ฝ ๋ชฉ์ ์ง€๋ฅผ ์•Œ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ SDN controller์—๊ฒŒ ์•Œ๋ฆผ์„ ๋ณด๋ƒ„ - ์ฝ”๋“œ
        control main() {
          // Verify mTag state and port are consistent
          table(source_check);
                
          // If no error from source_check, continue
          if (!defined(metadata.ingress_error)) {
            // Attempt to switch to end hosts
            table(local_switching);
                  
            if (!defined(metadata.egress_spec)) {
              // Not a known local host; try mtagging
              table(mTag_table);
            }
                  
            // Check for unknown egress state or
            // bad retagging with mTag.
            table(egress_check);
          }
        }
      

Compiling A P4 Program

Compiling Packet Parsers

  • ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ€๋Šฅํ•œ ํŒŒ์„œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ํ”„๋กœ๊ทธ๋ž˜๋จธ ์ฝ”๋“œ์„ ํ†ตํ•ด ํŒŒ์‹ฑ ์ƒํƒœ ๋จธ์‹ ์œผ๋กœ ๋งŒ๋“ฆ
  • ๊ณ ์ •๋œ ํŒŒ์„œ์˜ ๊ฒฝ์šฐ, ์ฝ”๋“œ๊ฐ€ ์‹ค์ œ ์žฅ๋น„์˜ ์‚ฌ์–‘์ด ์ผ์น˜ํ•˜๋Š”์ง€๋งŒ ํ™•์ธ
  • ํŒŒ์„œ์˜ VLAN ๋ฐ mTag ์„น์…˜์— ๋Œ€ํ•œ ์ƒํƒœ ํ…Œ์ด๋ธ” ์—”ํŠธ๋ฆฌ

    image.png

    • ํ˜„์žฌ ์ƒํƒœ, ๋งค์นญํ•  ํ•„๋“œ ๊ฐ’, ๋‹ค์Œ ์ƒํƒœ๋ฅผ ์ง€์ •

Compiling Control Programs

์ œ์–ด ํ”„๋กœ๊ทธ๋žจ ๋ถ„์„์„ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์‹๋ณ„ํ•˜๋ฉฐ ํ—ค๋” ํ•„๋“œ๋ฅผ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌ. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์Šค์œ„์น˜๋ฅผ ์œ„ํ•œ ํƒ€๊ฒŸ configuration์„ ์ƒ์„ฑ

ํƒ€๊ฒŸ์— ๋”ฐ๋ฅธ ํ”„๋กœ์„ธ์Šค

๊ธฐ๋ณธ์ ์œผ๋กœ 2๋‹จ๊ณ„ ์ปดํŒŒ์ผ ํ”„๋กœ์„ธ์Šค ( ์ฝ”๋“œ๋ฅผ TDG๋กœ ๋ฐ”๊พผ ํ›„ ์˜์กด์„ฑ ํ™•์ธ. ์žฅ๋น„์— ๋งž์ถฐ ๋ฐฐ์น˜ )๋ฅผ ๋”ฐ๋ฆ„

  • ์†Œํ”„ํŠธ์›จ์–ด ์Šค์œ„์น˜
    • ํŠน์ง• : ํ…Œ์ด๋ธ” ์ˆ˜, ํ…Œ์ด๋ธ” ๊ตฌ์„ฑ ๋ฐ ํŒŒ์‹ฑ์ด ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•˜์—ฌ ์œ ์—ฐํ•จ
    • ๋ฐฉ์‹ : mTag TDG๋ฅผ ํ…Œ์ด๋ธ”์— ๊ทธ๋Œ€๋กœ ๋งคํ•‘. ํ…Œ์ด๋ธ” ์œ ํ˜• ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ด๋ธ”์˜ ๋„ˆ๋น„, ๋†’์ด ๋ฐ ๋งค์นญ ๊ธฐ์ค€(์˜ˆ: exact, prefix ๋˜๋Š” wildcard)์„ ์ œํ•œ. ์†Œํ”„ํŠธ์›จ์–ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ternary ๋˜๋Š” prefix ๋งค์นญ์„ ์ตœ์ ํ™”
  • RAM&TCAM์„ ๊ฐ€์ง„ ํ•˜๋“œ์›จ์–ด ์Šค์œ„์น˜
    • ๋ฐฉ์‹
      • mTag ํ…Œ์ด๋ธ”์— ๋Œ€ํ•ด RAM์„ ์‚ฌ์šฉํ•˜์—ฌ Hashing ๊ธฐ๋ฐ˜ ์ •ํ™•๋„ ๋งค์นญ์„ ์ˆ˜ํ–‰.
      • ํƒœ๊ทธ ์ผ๋ถ€๋งŒ ๋งค์นญํ•˜๋Š” ์ฝ”์–ด mTag ํฌ์›Œ๋”ฉ ํ…Œ์ด๋ธ”์€ TCAM์— ๋งคํ•‘
  • ๋ณ‘๋ ฌ ํ…Œ์ด๋ธ”์„ ์ง€์›ํ•œ๋А ์Šค์œ„์น˜
    • ๋ฐฉ์‹ : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์˜์กด์„ฑ์„ ๊ฐ์ง€ํ•˜์—ฌ ํ…Œ์ด๋ธ”์„ ๋ณ‘๋ ฌ ๋˜๋Š” ์ง๋ ฌ๋กœ ๋ฐฐ์น˜
      • ์˜ˆ๋ฅผ ๋“ค์–ด, mTag_table๊ณผ local_switching ํ…Œ์ด๋ธ”์€ ์˜์กด์„ฑ์ด ์—†์œผ๋ฏ€๋กœ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰
  • ํŒŒ์ดํ”„๋ผ์ธ ๋์—์„œ ์•ก์…˜์„ ์ ์šฉํ•˜๋Š” ์Šค์œ„์น˜
    • ๋ฐฉ์‹ : ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ค‘๊ฐ„ ๋‹จ๊ณ„์—์„œ ์ตœ์ข… ์“ฐ๊ธฐ์— ์‚ฌ์šฉ๋  ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์ง€์‹œ
  • ์ ์€ ์ˆ˜์˜ ํ…Œ์ด๋ธ”์„ ๊ฐ€์ง„ ์Šค์œ„์น˜
    • ๋ฐฉ์‹ : ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋‹ค์ˆ˜์˜ P4 ํ…Œ์ด๋ธ”์„ ๋” ์ ์€ ์ˆ˜์˜ ๋ฌผ๋ฆฌ์  ํ…Œ์ด๋ธ”๋กœ ๋งคํ•‘. ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ์ƒˆ๋กœ์šด ๊ทœ์น™์„ ์„ค์น˜ํ•  ๋•Œ, ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๊ทœ์น™ ๋ณ€ํ™˜๊ธฐ๋Š” ๋‘ P4 ํ…Œ์ด๋ธ”์˜ ๊ทœ์น™์„ ํ•ฉ์„ฑํ•˜์—ฌ ๋‹จ์ผ ๋ฌผ๋ฆฌ์  ํ…Œ์ด๋ธ”์„ ์œ„ํ•œ ๊ทœ์น™์„ ์ƒ์„ฑ
      • ์˜ˆ๋ฅผ ๋“ค์–ด, local_switching์€ mTag ํ…Œ์ด๋ธ”๊ณผ ํ†ตํ•ฉ

Conclusion

  • OpenFlow์˜ ํ•œ๊ณ„ : ๋ฏธ๋ฆฌ ์ •ํ•ด์ง„ ํ—ค๋”์™€ ์•ก์…˜๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์ • ๊ธฐ๋Šฅ ์Šค์œ„์น˜๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ธฐ์— ์œ ์—ฐ์„ฑ ๋ถ€์กฑ
  • Data plane ์ œ์–ด : ์ฝ”๋“œ โ†’ TDG โ†’ ํƒ€๊ฒŸ ์Šค์œ„์น˜์— ๋งคํ•‘
  • ํ˜„์žฌ๋Š” ํŒจํ‚ท ์ฒ˜๋ฆฌ ๋ฐฉ์‹์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ํ˜ผ์žก ์ œ์–ด, ํ์ž‰, ํŠธ๋ž˜ํ”ฝ ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ ์„ธ๋ถ€์  ์ธก๋ฉด์€ ๊ณผ์ œ๋กœ ๋‚จ์Œ

Categories:

Updated:

Leave a comment